/*
栈区
    谁先创建 谁先构建
    和创建的顺序相反

堆区
    谁先创建 谁先构建
    谁先释放 谁先析构
*/
#include <iostream>
#include <string>

using namespace std;

int num = 1;

class stu
{
private:
    int val;
public:
    // 默认构造函数
    stu()
    {
        // 将 num 的值赋给 val，并将 num 自增 1
        val = num++;
        // 输出构造函数调用信息
        cout << "我是：" << val << "构建了" << endl;
    }
    // 带参数的构造函数
    stu(int stu_val)
    {
        // 将 num 的值赋给 val，并将 num 自增 1
        val = num++;
        // 输出构造函数调用信息
        cout << "我是：" << val << "构建了" << endl;
    }    
    // 析构函数
    ~stu()
    {
        // 输出析构函数调用信息
        cout << "我是：" << val << "析构了" << endl;
    }
};

int main(int argc, char const *argv[])
{
    // 栈区
    // // 创建 stu 类的对象 s1，调用带参数的构造函数 stu(int stu_val)
    // stu s1(1);
    // // 创建 stu 类的对象 s2，调用带参数的构造函数 stu(int stu_val)
    // stu s2(2);
    // // 创建 stu 类的对象 s3，调用带参数的构造函数 stu(int stu_val)
    // stu s3(3);
    // // 创建 stu 类的对象 s4，调用带参数的构造函数 stu(int stu_val)
    // stu s4(4);

    // 堆区空间
    // 使用 new 运算符在堆区创建 stu 类的对象，调用默认构造函数 stu()
    stu * s_p_1 = new stu; 
    // 使用 new 运算符在堆区创建 stu 类的对象，调用默认构造函数 stu()
    stu * s_p_2 = new stu;
    // 使用 new 运算符在堆区创建 stu 类的对象，调用默认构造函数 stu()
    stu * s_p_3 = new stu;
    // 使用 new 运算符在堆区创建 stu 类的对象，调用默认构造函数 stu()
    stu * s_p_4 = new stu;

    // 使用 delete 运算符释放堆区创建的对象 s_p_1，调用 s_p_1 指向对象的析构函数
    delete s_p_1; 
    // 使用 delete 运算符释放堆区创建的对象 s_p_2，调用 s_p_2 指向对象的析构函数
    delete s_p_2;
    // 使用 delete 运算符释放堆区创建的对象 s_p_3，调用 s_p_3 指向对象的析构函数
    delete s_p_3;
    // 使用 delete 运算符释放堆区创建的对象 s_p_4，调用 s_p_4 指向对象的析构函数
    delete s_p_4;

    return 0;
}